home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / ixtrace / ixtrace-1.0.c next >
C/C++ Source or Header  |  1995-01-14  |  30KB  |  888 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19.  
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <unistd.h>
  23. #include <string.h>
  24. #include <sys/tracecntl.h>
  25. #include <signal.h>
  26. #include <fcntl.h>
  27. #include <sys/ioctl.h>
  28. #include <sys/ioctl_compat.h>
  29. #include <sys/termios.h>
  30. #include <exec/types.h>
  31. #include <libraries/dos.h>
  32.  
  33. #include <inline/exec.h>
  34. extern struct MsgPort *CreatePort (char *, int);
  35.  
  36. void print_call (FILE *output, struct trace_packet *tp);
  37.  
  38. int print_all = 0;
  39. int skip_sigsetmask = 0;
  40. FILE *output;
  41.  
  42. void
  43. dummy_handler ()
  44. {
  45. }
  46.  
  47. int
  48. main (int argc, char *argv[])
  49. {
  50.   char *logfile = "-";
  51.   struct trace_packet tp = { 0,};
  52.   struct MsgPort *mp;
  53.   int c, in = 0;
  54.  
  55.   signal (SIGMSG, dummy_handler);
  56.  
  57.   while ((c = getopt (argc, argv, "aimo:p:s:")) != EOF)
  58.     switch (c)
  59.       {
  60.       case 'a':
  61.     print_all = 1;
  62.     break;
  63.  
  64.       case 'i':
  65.     in = 1;
  66.     break;
  67.  
  68.       case 'm':
  69.     skip_sigsetmask = 1;
  70.     break;
  71.  
  72.       case 'o':
  73.     logfile = optarg;
  74.     break;
  75.  
  76.       case 'p':
  77.     tp.tp_pid = atoi (optarg);
  78.     break;
  79.     
  80.       case 's':
  81.         tp.tp_syscall = atoi (optarg);
  82.         break;
  83.  
  84.       default:
  85.     fprintf (stderr, 
  86.          "%s [-a] [-m] [-o logfile] [-p pid] [-s syscall-number]\n"
  87.          "  -a  trace all calls (else __-calls are skipped)\n"
  88.          "  -i  trace entry to functions. Default is exit.\n"
  89.          "  -m  skip sigsetmask() calls (they're heavily used inside the library)\n"
  90.          "  -o  log output to logfile (default is stdout)\n"
  91.          "  -p  only trace process pid (default is to trace all processes)\n"
  92.          "  -s  only trace this syscall (default is to trace all calls)\n",
  93.          argv[0]);
  94.         return 1;
  95.       }
  96.  
  97.   if (logfile[0] == '-' && !logfile[1])
  98.     output = stdout;
  99.   else
  100.     output = fopen (logfile, "w");
  101.  
  102.   if (!output)
  103.     {
  104.       perror ("fopen");
  105.       return 1;
  106.     }
  107.  
  108.   if (mp = CreatePort (0, 0))
  109.     {
  110.       tp.tp_tracer_port = mp;
  111.       if (tracecntl (TRACE_INSTALL_HANDLER, &tp) == 0)
  112.     {
  113.       while (1)
  114.         {
  115.           struct Message *msg;
  116.           long sigs;
  117.  
  118.           sigs = Wait ((1 << mp->mp_SigBit) | SIGBREAKF_CTRL_C);
  119.           while (msg = GetMsg (mp))
  120.         {
  121.               if (msg != (struct Message *) &tp)
  122.             {
  123.               fprintf (stderr, "Got alien message! Don't do that ever again ;-)\n");
  124.             } 
  125.               else
  126.             {
  127.               if (in)
  128.             tp.tp_action = TRACE_ACTION_JMP;
  129.               if (! tp.tp_is_entry || tp.tp_action == TRACE_ACTION_JMP)
  130.                 print_call (output, &tp);
  131.             }
  132.               Signal ((struct Task *) msg->mn_ReplyPort, SIGBREAKF_CTRL_E);
  133.             }
  134.           if (sigs & SIGBREAKF_CTRL_C)
  135.         break;
  136.         }
  137.       tracecntl (TRACE_REMOVE_HANDLER, &tp);
  138.     }
  139.       else
  140.     perror ("tracecntl");
  141.       
  142.       DeletePort (mp);
  143.     }
  144.   else
  145.     perror ("CreatePort");
  146. }
  147.  
  148. void vp (), vp_fcntl (), vp_ioctl (), vp_open (), vp_pipe ();
  149.  
  150.  
  151. struct call {
  152.   int  interesting;
  153.   char *name;
  154.   void (*func)(...);
  155.   char *fmt;
  156.   char *rfmt;
  157. } call_table[] = {
  158.   { 1, "bad call",    vp,    "",        "",        },
  159.   { 1, "abort",    vp,    "()",        "",        },
  160.   { 1, "abs",    vp,    "(%d)",        "%d",        },
  161.   { 1, "access",    vp,    "(\"%s\", %d)",    "%d",        },
  162.   { 1, "alarm",    vp,    "(%d)",        "%d",        },
  163.   { 1, "atexit",    vp,    "($%lx)",    "%d",        },
  164.   { 1, "atof",    vp,    "(\"%s\")",        "%g",        },
  165.   { 1, "atoi",    vp,    "(\"%s\")",        "%d",        },
  166.   { 1, "atol",    vp,    "(\"%s\")",        "%d",        },
  167.   { 1, "bcmp",    vp,    "($%lx, $%lx, %d)",    "%d",        },
  168.   { 1, "bcopy",    vp,    "($%lx, $%lx, %d)",    "",        },
  169.   { 1, "bsearch",    vp,    "($%lx, $%lx, %d, %d, $%lx)",     "$%lx",        },
  170.   { 1, "bzero",    vp,    "($%lx, %d)",    "",        },
  171.   { 1, "calloc",    vp,    "(%d, %d)",    "$%lx",        },
  172.   { 1, "cfgetispeed",vp,    "($%lx)",    "%d",        },
  173.   { 1, "cfgetospeed",vp,    "($%lx)",    "%d",        },
  174.   { 1, "cfmakeraw",    vp,    "($%lx)",    "%d",        },
  175.   { 1, "cfree",    vp,    "($%lx)",    "",        },
  176.   { 1, "cfsetispeed",vp,    "($%lx)",    "%d",        },
  177.   { 1, "cfsetospeed",vp,    "($%lx)",    "%d",        },
  178.   { 1, "cfsetspeed",    vp,    "($%lx)",    "%d",        },
  179.   { 1, "chdir",    vp,    "(\"%s\")",        "%d",        },
  180.   { 1, "chmod",    vp,    "(\"%s\", %o)",    "%d",        },
  181.   { 1, "chown",    vp,    "(\"%s\", %d, %d)",    "%d",        },
  182.   { 1, "clock",    vp,    "()",        "%d",        },
  183.   { 1, "close",    vp,    "(%d)",        "%d",        },
  184.   { 1, "creat",    vp,    "(\"%s\", %o)",    "%d",        },
  185.   { 1, "CreateExtIO",vp,    "($%lx, %d)",    "$%lx",        },
  186.   { 1, "CreatePort",    vp,    "(\"%s\", %d)",    "$%lx",        },
  187.   { 1, "CreateStdIO",vp,    "($%lx)",    "$%lx",        },
  188.   { 1, "CreateTask",    vp,    "(\"%s\", %d, $%lx, %d)",    "$%lx",        },
  189.   { 1, "DeleteExtIO",vp,    "($%lx)",    "",        },
  190.   { 1, "DeletePort",    vp,    "($%lx)",    "",        },
  191.   { 1, "DeleteStdIO",vp,    "($%lx)",    "",        },
  192.   { 1, "DeleteTask",    vp,    "($%lx)",    "",        },
  193.   { 1, "difftime",    vp,    "(%d, %d)",    "%d",        },
  194.   { 1, "div",    vp,    "(%d, %d)",    "%d",        },
  195.   { 1, "dup",    vp,    "(%d)",        "%d",        },
  196.   { 1, "dup2",    vp,    "(%d, %d)",    "%d",        },
  197.   { 1, "exit",    vp,    "(%d)",        "",        },
  198.   { 1, "fchmod",    vp,    "(%d, %o)",    "%d",        },
  199.   { 1, "fcntl",    vp_fcntl,    "(%d, \"%s\", %d)", "%d",        },
  200.   { 1, "ffs",    vp,    "(%d)",        "%d",        },
  201.   { 1, "flock",    vp,    "(%d, %d)",    "%d",        },
  202.   { 1, "free",    vp,    "($%lx)",    "",        },
  203.   { 1, "frexp",    vp,    "(%g, %g)",    "%g",        },
  204.   { 1, "fstat",    vp,     "(%d, $%lx)",    "%d",        },
  205.   { 1, "fsync",    vp,    "(%d)",        "%d",        },
  206.   { 1, "ftime",    vp,    "(%d)",        "%d",        },
  207.   { 1, "ftruncate",    vp,    "(%d, %d)",    "%d",        },
  208.   { 1, "getcwd",    vp,    "(\"%s\", %d)",    "%d",        },
  209.   { 1, "getdtablesize",vp,    "()",        "%d",        },
  210.   { 1, "getegid",    vp,    "(%d)",        "%d",        },
  211.   { 1, "getenv",    vp,    "(\"%s\")",        "\"%s\"",        },
  212.   { 1, "geteuid",    vp,    "()",        "%d",        },
  213.   { 1, "getgid",    vp,    "()",        "%d",        },
  214.   { 1, "getgrgid",    vp,    "()",        "%d",        },
  215.   { 1, "getgroups",    vp,    "(%d, $%lx)",    "%d",        },
  216.   { 1, "gethostname",vp,    "(\"%s\", %d)",    "%d",        },
  217.   { 1, "getitimer",    vp,    "(%d, $%lx)",    "%d",        },
  218.   { 1, "getpagesize",vp,    "()",        "%d",        },
  219.   { 1, "getpgrp",    vp,    "(%d)",        "%d",        },
  220.   { 1, "getpid",    vp,    "()",        "$%lx",        },
  221.   { 1, "getppid",    vp,    "()",        "$%lx",        },
  222.   { 1, "getpriority",vp,    "(%d, %d)",    "%d",        },
  223.   { 1, "getpwnam",    vp,    "(\"%s\")",        "$%lx",        },
  224.   { 1, "getpwuid",    vp,    "(%d)",        "$%lx",        },
  225.   { 1, "getrlimit",    vp,    "(%d, $%lx)",    "%d",        },
  226.   { 1, "getrusage",    vp,    "(%d, $%lx)",    "%d",        },
  227.   { 1, "gettimeofday",vp,    "($%lx, $%lx)",    "%d",        },
  228.   { 1, "getuid",    vp,    "()",        "%d",        },
  229.   { 1, "getwd",    vp,    "(\"%s\")",        "%d",        },
  230.   { 1, "index",    vp,    "(\"%s\", %c)",    "$%lx",        },
  231.   { 1, "initgroups",    vp,    "(\"%s\", %d)",    "%d",        },
  232.   { 1, "insque",    vp,    "($%lx, $%lx)",    "",        },
  233.   { 1, "ioctl",        vp_ioctl,    "(%d, $%lx, $%lx)", "%d",        },
  234.   { 1, "isalnum",    vp,    "(%c)",        "%d",        },
  235.   { 1, "isalpha",    vp,    "(%c)",        "%d",        },
  236.   { 1, "isatty",    vp,    "(%d)",        "%d",        },
  237.   { 1, "iscntrl",    vp,    "(%c)",        "%d",        },
  238.   { 1, "isdigit",    vp,    "(%c)",        "%d",        },
  239.   { 1, "isgraph",    vp,    "(%c)",        "%d",        },
  240.   { 1, "islower",    vp,    "(%c)",        "%d",        },
  241.   { 1, "isprint",    vp,    "(%c)",        "%d",        },
  242.   { 1, "ispunct",    vp,    "(%c)",        "%d",        },
  243.   { 1, "isspace",    vp,    "(%c)",        "%d",        },
  244.   { 1, "isupper",    vp,    "(%c)",        "%d",        },
  245.   { 1, "isxdigit",    vp,    "(%c)",        "%d",        },
  246.   { 1, "ix_startup",    vp,    "(\"%s\", %d, %d, \"%s\", $%lx, $%lx)", "%d",        },
  247.   { 1, "kill",    vp,    "($%lx, %d)",    "%d",        },
  248.   { 1, "killpg",    vp,    "($%lx, %d)",    "%d",        },
  249.   { 1, "labs",    vp,    "(%d)",        "%d",        },
  250.   { 1, "ldiv",    vp,    "(%d, %d)",    "%d",        },
  251.   { 1, "link",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  252.   { 1, "longjmp",    vp,    "($%lx, %d)",    "%d",        },
  253.   { 1, "longjmperror",vp,    "()",        "",        },
  254.   { 1, "lseek",    vp,    "(%d, %d, %d)",    "%d",        },
  255.   { 1, "lstat",    vp,    "(\"%s\", $%lx)",        "%d",        },
  256.   { 1, "malloc",    vp,    "(%d)",        "$%lx",        },
  257.   { 1, "memalign",    vp,    "(%d, %d)",    "$%lx",        },
  258.   { 1, "memccpy",    vp,    "($%lx, $%lx, %d, %d)", "$%lx",        },
  259.   { 1, "memchr",    vp,    "($%lx, %d, %d)",    "$%lx",        },
  260.   { 1, "memcmp",    vp,    "($%lx, $%lx, %d)",    "%d",        },
  261.   { 1, "memcpy",    vp,    "($%lx, $%lx, %d)",    "$%lx",        },
  262.   { 1, "memmove",    vp,    "($%lx, $%lx, %d)",    "$%lx",        },
  263.   { 1, "memset",    vp,    "($%lx, %d, %d)",    "$%lx",        },
  264.   { 1, "mkdir",    vp,    "(\"%s\", %o)",    "%d",        },
  265.   { 1, "mkstemp",    vp,    "(\"%s\")",        "%d",        },
  266.   { 1, "mktemp",    vp,    "(\"%s\")",        "\"%s\"",        },
  267.   { 1, "open",    vp_open,    "(\"%s\", \"%s\", %o)",    "%d",        },
  268.   { 1, "pause",    vp,    "()",    "%d",        },
  269.   { 1, "perror",    vp,    "(\"%s\")",    "%d",        },
  270.   { 1, "pipe",    vp_pipe,    "([%d, %d])",    "%d",        },
  271.   { 1, "psig",    vp,    "bad call",    "",        },
  272.   { 1, "psignal",    vp,    "(%d, \"%s\")",    "",        },
  273.   { 1, "putenv",    vp,    "(\"%s\")",        "",        },
  274.   { 1, "qsort",    vp,    "($%lx, %d, %d, $%lx)",    "",        },
  275.   { 1, "rand",    vp,    "()",    "%d",        },
  276.   { 1, "random",    vp,    "()",    "%d",        },
  277.   { 1, "read",    vp,    "(%d, $%lx, %d)",    "%d",        },
  278.   { 1, "readlink",    vp,    "(\"%s\", \"%s\", %d)",        "%d",        },
  279.   { 1, "readv",    vp,    "(%d, $%lx, %d)",    "%d",        },
  280.   { 1, "realloc",    vp,    "($%lx, %d)",    "$%lx",        },
  281.   { 1, "remove",    vp,    "(\"%s\")",    "%d",        },
  282.   { 1, "remque",    vp,    "($%lx)",    "",        },
  283.   { 1, "rename",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  284.   { 1, "rindex",    vp,    "(\"%s\", %c)",    "$%lx",        },
  285.   { 1, "rmdir",    vp,    "(\"%s\")",    "%d",        },
  286.   { 1, "select",    vp,    "(%d, $%lx, $%lx, $%lx, $%lx)",    "%d",        },
  287.   { 1, "setenv",    vp,    "(\"%s\", \"%s\", %d)",    "%d",        },
  288.   { 1, "setgroups",    vp,    "(%d, $%lx)",    "%d",        },
  289.   { 1, "sethostname",vp,    "(\"%s\", %d)",    "%d",        },
  290.   { 1, "setitimer",    vp,    "(%d, $%lx, $%lx)",    "%d",        },
  291.   { 1, "setjmp",    vp,    "($%lx, %d)",    "%d",        },
  292.   { 1, "setpgrp",    vp,    "($%lx, $%lx)",    "%d",        },
  293.   { 1, "setpriority",vp,    "(%d, %d, %d)",    "%d",        },
  294.   { 1, "setrlimit",    vp,    "(%d, $%lx)",    "%d",        },
  295.   { 1, "settimeofday",vp,    "($%lx, $%lx)",    "%d",        },
  296.   { 1, "sigaction",    vp,    "(%d, $%lx, $%lx)",    "%d",        },
  297.   { 1, "sigaddset",    vp,    "($%lx, %d)",    "%d",        },
  298.   { 1, "sigblock",    vp,    "($%lx)",    "%d",        },
  299.   { 1, "sigdelset",    vp,    "($%lx, %d)",    "%d",        },
  300.   { 1, "sigemptyset",vp,    "($%lx)",    "%d",        },
  301.   { 1, "sigfillset",    vp,    "($%lx)",    "%d",        },
  302.   { 1, "siginterrupt",vp,    "(%d, %d)",    "%d",        },
  303.   { 1, "sigismember",vp,    "($%lx, %d)",    "%d",        },
  304.   { 1, "siglongjmp",    vp,    "($%lx, %d)",    "%d",        },
  305.   { 1, "signal",    vp,    "(%d, $%lx)",    "$%lx",        },
  306.   { 1, "sigpause",    vp,    "($%lx)",    "%d",        },
  307.   { 1, "sigpending",    vp,    "($%lx)",    "%d",        },
  308.   { 1, "sigprocmask",vp,    "(%d, $%lx, $%lx)",     "%d",        },
  309.   { 1, "sigreturn",    vp,    "($%lx)",    "%d",        },
  310.   { 1, "sigsetjmp",    vp,    "($%lx, %d)",    "%d",        },
  311.   { 1, "sigsetmask",    vp,    "($%lx)",    "$%lx",        },
  312.   { 1, "sigstack",    vp,    "($%lx)",    "%d",        },
  313.   { 1, "sigsuspend",    vp,    "($%lx)",    "%d",        },
  314.   { 1, "sigvec",    vp,    "(%d, $%lx, $%lx)",    "%d",        },
  315.   { 1, "sleep",    vp,    "(%d)",    "%d",        },
  316.   { 1, "srand",    vp,    "(%d)",    "",        },
  317.   { 1, "srandom",    vp,    "(%d)",    "",        },
  318.   { 1, "stat",    vp,    "(\"%s\", $%lx)",    "%d",        },
  319.   { 1, "strcasecmp",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  320.   { 1, "strcat",    vp,    "(\"%s\", \"%s\")",    "$%lx",        },
  321.   { 1, "strchr",    vp,    "(\"%s\", %c)",    "$%lx",        },
  322.   { 1, "strcmp",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  323.   { 1, "strcoll",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  324.   { 1, "strcpy",    vp,    "($%lx, \"%s\")",    "$%lx",        },
  325.   { 1, "strcspn",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  326.   { 1, "strdup",    vp,    "(\"%s\")",        "$%lx",        },
  327.   { 1, "strerror",    vp,    "(%d)",        "\"%s\"",        },
  328.   { 1, "strftime",    vp,    "(\"%s\", %d, \"%s\", $%lx)", "%d",        },
  329.   { 1, "strlen",    vp,    "(\"%s\")",    "%d",        },
  330.   { 1, "strmode",    vp,    "(\"%s\", %o)",    "",        },
  331.   { 1, "strncasecmp",vp,    "(\"%s\", \"%s\", %d)",    "%d",        },
  332.   { 1, "strncat",    vp,    "(\"%s\", \"%s\", %d)",    "$%lx",        },
  333.   { 1, "strncmp",    vp,    "(\"%s\", \"%s\", %d)",    "%d",        },
  334.   { 1, "strncpy",    vp,    "($%lx, \"%s\", %d)", "$%lx",        },
  335.   { 1, "strpbrk",    vp,    "(\"%s\", \"%s\")",    "$%lx",        },
  336.   { 1, "strrchr",    vp,    "(\"%s\", %c)",    "$%lx",        },
  337.   { 1, "strsep",    vp,    "($%lx, \"%s\")",    "\"%s\"",        },
  338.   { 1, "strspn",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  339.   { 1, "strstr",    vp,    "(\"%s\", \"%s\")",    "\"%s\"",        },
  340.   { 1, "strtok",    vp,    "(\"%s\", \"%s\")",    "\"%s\"",        },
  341.   { 1, "strtol",    vp,    "(\"%s\", $%lx, %d)",    "%d",        },
  342.   { 1, "strtoul",    vp,    "(\"%s\", $%lx, %d)",    "%d",        },
  343.   { 1, "strunvis",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  344.   { 1, "strvis",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  345.   { 1, "strvisx",    vp,    "(\"%s\", \"%s\", %d, %d)",    "%d",        },
  346.   { 1, "strxfrm",    vp,    "(\"%s\", \"%s\", %d)",    "%d",        },
  347.   { 1, "swab",    vp,    "($%lx, $%lx, %d)",    "",        },
  348.   { 1, "symlink",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  349.   { 1, "system",    vp,    "(\"%s\")",    "%d",        },
  350.   { 1, "tcgetattr",    vp,    "(%d, $%lx)",    "%d",        },
  351.   { 1, "tcgetpgrp",    vp,    "(%d)",    "$%lx",        },
  352.   { 1, "tcsetattr",    vp,    "(%d, $%lx)",    "%d",        },
  353.   { 1, "tcsetpgrp",    vp,    "(%d, $%lx)",    "%d",        },
  354.   { 1, "time",    vp,    "($%lx)",    "%d",        },
  355.   { 1, "tmpnam",    vp,    "(\"%s\")",    "\"%s\"",        },
  356.   { 1, "tolower",    vp,    "(%c)",    "%c",        },
  357.   { 1, "toupper",    vp,    "(%c)", "%c",        },
  358.   { 1, "truncate",    vp,    "(\"%s\", %d)",    "%d",        },
  359.   { 1, "ualarm",    vp,    "(%d, %d)",    "%d",        },
  360.   { 1, "umask",    vp,    "(%o)",    "%d",        },
  361.   { 1, "unlink",    vp,    "(\"%s\")",    "%d",        },
  362.   { 1, "unvis",    vp,    "(\"%s\", %c, $%lx, %d)",    "%d",        },
  363.   { 1, "usleep",    vp,    "(%d)",    "%d",        },
  364.   { 1, "utime",    vp,    "(\"%s\", $%lx)",    "%d",        },
  365.   { 1, "utimes",    vp,    "(\"%s\", $%lx)",    "%d",        },
  366.   { 1, "valloc",    vp,    "(%d)",    "$%lx",        },
  367.   { 1, "vis",    vp,    "(\"%s\", %c, $%lx, %d)",    "\"%s\"",        },
  368.   { 1, "write",    vp,    "(%d, $%lx, %d)",    "%d",        },
  369.   { 1, "writev",    vp,    "(%d, $%lx, %d)",    "%d",        },
  370.   { 1, "_exit",    vp,    "(%d)",    "",        },
  371.   { 1, "_longjmp",    vp,    "($%lx, %d)",    "",        },
  372.   { 1, "_setjmp",    vp,    "($%lx)",    "%d",        },
  373.   { 1, "_wb_parse",    vp,    "($%lx, $%lx, \"%s\")",    "%d",        },
  374.   { 1, "_cli_parse",    vp,    "($%lx, %d, \"%s\", $%lx, $%lx)",    "%d",        },
  375.   { 1, "_main",    vp,    "($%lx, $%lx, $%lx)",    "%d",        },
  376.   { 0, "__adddf3",    vp,    "(%g, %g)",    "%g",        },
  377.   { 0, "__addsf3",    vp,    "(%g, %g)",    "%g",        },
  378.   { 0, "__ashldi3",    vp,    "($%0lx%08lx, %d)", "$%0lx%08lx",        },
  379.   { 0, "__ashlsi3",    vp,    "(%d)",    "%d",        },
  380.   { 0, "__ashrdi3",    vp,    "($%0lx%08lx, %d)", "$%0lx%08lx",        },
  381.   { 0, "__ashrsi3",    vp,    "(%d)",    "%d",        },
  382.   { 0, "__clear_cache",vp,    "()","",        },
  383.   { 0, "__cmpdf2",    vp,    "(%g, %g)",    "%d",        },
  384.   { 0, "__cmpdi2",    vp,    "($%0lx%08lx, $%0lx%08lx)", "%d",        },
  385.   { 0, "__cmpsf2",    vp,    "(%g, %g)",    "%d",        },
  386.   { 0, "__divdf3",    vp,    "(%g, %g)",    "%g",        },
  387.   { 0, "__divdi3",    vp,    "($%0lx%08lx, $%0lx%08lx)", "$%0lx%08lx",        },
  388.   { 0, "__divsf3",    vp,    "(%g, %g)",    "%g",        },
  389.   { 0, "__divsi3",    vp,    "(%d, %d)",    "%d",        },
  390.   { 0, "__eqdf2",    vp,    "(%g, %g)",    "%d",        },
  391.   { 0, "__eqsf2",    vp,    "(%g, %g)",    "%d",        },
  392.   { 0, "__extendsfdf2",vp,    "(%g)",    "%g",        },
  393.   { 0, "__fixdfdi",    vp,    "(%g)", "$%0lx%08lx)",        },
  394.   { 0, "__fixdfsi",    vp,    "(%g)",    "%g",        },
  395.   { 0, "__fixsfdi",    vp,    "(%g)",    "$%0lx%08lx",        },
  396.   { 0, "__fixsfsi",    vp,    "(%g)",    "%d",        },
  397.   { 0, "__fixunsdfdi",vp,    "(%g)",    "$%0lx%08lx",        },
  398.   { 0, "__fixunsdfsi",vp,    "(%g)",    "%d",        },
  399.   { 0, "__fixunssfdi",vp,    "(%g)",    "$%0lx%08lx",        },
  400.   { 0, "__fixunssfsi",vp,    "(%g)",    "%d",        },
  401.   { 0, "__floatdidf",vp,    "($%0lx%08lx)","%g",        },
  402.   { 0, "__floatdisf",vp,    "($%0lx%08lx)","%g",        },
  403.   { 0, "__floatsidf",vp,    "(%d)",    "%g",        },
  404.   { 0, "__floatsisf",vp,    "(%d)",    "%g",        },
  405.   { 0, "__gedf2",    vp,    "(%g, %g)",    "%d",        },
  406.   { 0, "__gesf2",    vp,    "(%g, %g)",    "%d",        },
  407.   { 0, "__gtdf2",    vp,    "(%g, %g)",    "%d",        },
  408.   { 0, "__gtsf2",    vp,    "(%g, %g)",    "%d",        },
  409.   { 0, "__ledf2",    vp,    "(%g, %g)",    "%d",        },
  410.   { 0, "__lesf2",    vp,    "(%g, %g)",    "%d",        },
  411.   { 0, "__lshldi3",    vp,    "($%0lx%08lx, %d)", "($%0lx%08lx)",        },
  412.   { 0, "__lshlsi3",    vp,    "(%d, %d)",    "%d",        },
  413.   { 0, "__lshrdi3",    vp,    "($%0lx%08lx, %d)", "($%0lx%08lx)",        },
  414.   { 0, "__lshrsi3",    vp,    "(%d, %d)",    "%d",        },
  415.   { 0, "__ltdf2",    vp,    "(%g, %g)",    "%d",        },
  416.   { 0, "__ltsf2",    vp,    "(%g, %g)",    "%d",        },
  417.   { 0, "__moddi3",    vp,    "($%0lx%08lx, $%0lx%08lx)",    "$%0lx%08lx",        },
  418.   { 0, "__modsi3",    vp,    "(%d, %d)",    "%d",        },
  419.   { 0, "__muldf3",    vp,    "(%g, %g)",    "%g",        },
  420.   { 0, "__muldi3",    vp,    "($%0lx%08lx, $%0lx%08lx)",    "$%0lx%08lx",        },
  421.   { 0, "__mulsf3",    vp,    "(%g, %g)",    "%g",        },
  422.   { 0, "__mulsi3",    vp,    "(%d, %d)",    "%d",        },
  423.   { 0, "__nedf2",    vp,    "(%g, %g)",    "%d",        },
  424.   { 0, "__negdf2",    vp,    "(%g)",    "%g",        },
  425.   { 0, "__negdi2",    vp,    "($%0lx%08lx)",    "$%0lx%08lx",        },
  426.   { 0, "__negsf2",    vp,    "(%g)",    "%g",        },
  427.   { 0, "__nesf2",    vp,    "(%g)",    "%g",        },
  428.   { 0, "__subdf3",    vp,    "(%g, %g)",    "%g",        },
  429.   { 0, "__subsf3",    vp,    "(%g, %g)",    "%g",        },
  430.   { 0, "__truncdfsf2",vp,    "(%g)",    "%g",        },
  431.   { 0, "__ucmpdi2",    vp,    "($%0lx%08lx, $%0lx%08lx)",    "%d",        },
  432.   { 0, "__udivdi3",    vp,    "($%0lx%08lx, $%0lx%08lx)", "$%0lx%08lx",        },
  433.   { 0, "__udivmoddi4",vp,    "($%0lx%08lx, $%0lx%08lx, $%0lx%08lx, $%0lx%08lx)", "",        },
  434.   { 0, "__udivsi3",    vp,    "(%d, %d)",    "%d",        },
  435.   { 0, "__umoddi3",    vp,    "($%0lx%08lx, $%0lx%08lx)",    "$%0lx%08lx",        },
  436.   { 0, "__umodsi3",    vp,    "(%d, %d)",    "%d",        },
  437.   { 1, "ix_get_vars",vp,    "($%lx, $%lx)",    "",        },
  438.   { 1, "modf",    vp,    "(%g, $%lx)",    "%g",        },
  439.   { 1, "opendir",    vp,    "(\"%s\")",    "$%lx",        },
  440.   { 1, "readdir",    vp,    "($%lx)",    "$%lx",        },
  441.   { 1, "rewinddir",    vp,    "($%lx)",    "",        },
  442.   { 1, "closedir",    vp,    "($%lx)",    "",        },
  443.   { 1, "telldir",    vp,    "($%lx)",    "%d",        },
  444.   { 1, "seekdir",    vp,    "($%lx, %d)",    "%d",        },
  445.   { 1, "ssystem",    vp,    "(\"%s\")",    "%d",        },
  446.   { 1, "isinf",    vp,    "(%g)",    "%d",        },
  447.   { 1, "isnan",    vp,    "(%g)",    "%d",        },
  448.   { 1, "ldexp",    vp,    "(%g, %d)",    "%g",        },
  449.   { 1, "achmod",    vp,    "(\"%s\", $%lx)",    "%d",        },
  450.   { 1, "stricmp",    vp,    "(\"%s\", \"%s\")",    "%d",        },
  451.   { 1, "strnicmp",    vp,    "(\"%s\", \"%s\", %d)",    "%d",        },
  452.   { 1, "atan",    vp,    "(%g)",    "%g",        },
  453.   { 1, "sin",    vp,    "(%g)",    "%g",        },
  454.   { 1, "cos",    vp,    "(%g)",    "%g",        },
  455.   { 1, "tan",    vp,    "(%g)",    "%g",        },
  456.   { 1, "sincos",    vp,    "($%lx, %g)",    "%g",        },
  457.   { 1, "sinh",    vp,    "(%g)",    "%g",        },
  458.   { 1, "cosh",    vp,    "(%g)",    "%g",        },
  459.   { 1, "tanh",    vp,    "(%g)",    "%g",        },
  460.   { 1, "exp",    vp,    "(%g)",    "%g",        },
  461.   { 1, "log",    vp,    "(%g)",    "%g",        },
  462.   { 1, "pow",    vp,    "(%g, %g)",    "%g",        },
  463.   { 1, "sqrt",    vp,    "(%g)",    "%g",        },
  464.   { 1, "asin",    vp,    "(%g)",    "%g",        },
  465.   { 1, "acos",    vp,    "(%g)",    "%g",        },
  466.   { 1, "log10",    vp,    "(%g)",    "%g",        },
  467.   { 1, "fabs",    vp,    "(%g)",    "%g",        },
  468.   { 1, "initstate",    vp,    "(%d, $%lx, %d)",    "$%lx",        },
  469.   { 1, "setstate",    vp,    "($%lx)",    "$%lx",        },
  470.   { 1, "ix_exec_entry",vp,    "(%d, $%lx, $%lx, $%lx, $%lx)",    "%d",        },
  471.   { 1, "ix_get_vars2",vp,    "(%d, $%lx, $%lx, $%lx, $%lx, $%lx, $%lx)",    "",        },
  472.   { 1, "execve",    vp,    "(\"%s\", $%lx, $%lx)",    "%d",        },
  473.   { 1, "execl",    vp,    "(\"%s\", \"%s\", \"%s\", ...)",    "%d",        },
  474.   { 1, "execv",    vp,    "(\"%s\", $%lx)",    "%d",        },
  475.   { 1, "execle",    vp,    "(\"%s\", $%lx, $%lx)",    "%d",        },
  476.   { 1, "execlp",    vp,    "(\"%s\", \"%s\", \"%s\", ...)",    "%d",        },
  477.   { 1, "execvp",    vp,    "(\"%s\", $%lx)",    "%d",        },
  478.   { 1, "vfork",    vp,    "()",    "%d",        },
  479.   { 1, "wait4",    vp,    "($%lx, $%lx, $%lx, $%lx)",    "%d",        },
  480.   { 1, "wait",    vp,    "($%lx)",    "%d",        },
  481.   { 1, "wait3",    vp,    "($%lx, $%lx, $%lx)",    "%d",        },
  482.   { 1, "waitpid",    vp,    "($%lx, $%lx, $%lx)",    "%d",        },
  483.   { 1, "vfork_resume",vp,    "()",    "",        },
  484.   { 1, "profil",    vp,    "($%lx, %d, %d, $%lx)",    "%d",        },
  485.   { 1, "ptrace",    vp,    "(%d, $%lx, $%lx, $%lx)",    "%d",        },
  486.   { 1, "clearerr",    vp,    "($%lx)",    "",        },
  487.   { 1, "fclose",    vp,    "($%lx)",    "%d",        },
  488.   { 1, "fdopen",    vp,    "(%d, \"%s\")",    "$%lx",        },
  489.   { 1, "feof",    vp,    "($%lx)",    "%d",        },
  490.   { 1, "ferror",    vp,    "($%lx)",    "%d",        },
  491.   { 1, "fflush",    vp,    "($%lx)",    "%d",        },
  492.   { 1, "fgetc",    vp,    "($%lx)",    "%d",        },
  493.   { 1, "fgetline",    vp,    "($%lx, $%lx)",    "\"%s\"",        },
  494.   { 1, "fgetpos",    vp,    "($%lx, $%lx)",    "%d",        },
  495.   { 1, "fgets",    vp,    "(\"%s\", %d, $%lx)",    "$%lx",        },
  496.   { 1, "fileno",    vp,    "($%lx)",    "%d",        },
  497.   { 1, "f_prealloc",    vp,    "()",    "",        },
  498.   { 1, "fopen",    vp,    "(\"%s\", \"%s\")",    "$%lx",        },
  499.   { 1, "fprintf",    vp,    "($%lx, \"%s\", ...)",    "%d",        },
  500.   { 1, "fpurge",    vp,    "($%lx)",    "%d",        },
  501.   { 1, "fputc",    vp,    "(%d, $%lx)",    "%d",        },
  502.   { 1, "fputs",    vp,    "(\"%s\", $%lx)",    "%d",        },
  503.   { 1, "fread",    vp,    "($%lx, %d, %d, $%lx)",    "%d",        },
  504.   { 1, "freopen",    vp,    "(\"%s\", \"%s\", $%lx)",    "$%lx",        },
  505.   { 1, "fscanf",    vp,    "($%lx, \"%s\", ...)",    "%d",        },
  506.   { 1, "fseek",    vp,    "($%lx, %d, %d)",    "%d",        },
  507.   { 1, "fsetpos",    vp,    "($%lx, $%lx)",    "%d",        },
  508.   { 1, "ftell",    vp,    "($%lx)",    "%d",        },
  509.   { 1, "funopen",    vp,    "($%lx, $%lx, $%lx, $%lx, $%lx)",    "%d",        },
  510.   { 1, "fwrite",    vp,    "($%lx, %d, %d, $%lx)",    "%d",        },
  511.   { 1, "getc",    vp,    "($%lx)",    "%d",        },
  512.   { 1, "getchar",    vp,    "()",    "%d",        },
  513.   { 1, "gets",    vp,    "(\"%s\")",    "\"%s\"",        },
  514.   { 1, "getw",    vp,    "($%lx)",    "%d",        },
  515.   { 1, "printf",    vp,    "(\"%s\", ...)",    "%d",        },
  516.   { 1, "putc",    vp,    "(%d, $%lx)",    "%d",        },
  517.   { 1, "putchar",    vp,    "(%d)",    "%d",        },
  518.   { 1, "puts",    vp,    "(\"%s\")",    "%d",        },
  519.   { 1, "putw",    vp,    "(%d, $%lx)",    "%d",        },
  520.   { 1, "rewind",    vp,    "($%lx)",    "%d",        },
  521.   { 1, "scanf",    vp,    "(\"%s\", ...)",    "%d",        },
  522.   { 1, "setbuf",    vp,    "($%lx, $%lx)",    "",        },
  523.   { 1, "setbuffer",    vp,    "($%lx, $%lx, %d)",    "",        },
  524.   { 1, "setlinebuf",    vp,    "($%lx)",    "",        },
  525.   { 1, "setvbuf",    vp,    "($%lx, $%lx, %d, %d)",    "%d",        },
  526.   { 1, "snprintf",    vp,    "(\"%s\", %d, \"%s\", ...)",    "%d",        },
  527.   { 1, "sprintf",    vp,    "($%lx, \"%s\", ...)",    "%d",        },
  528.   { 1, "sscanf",    vp,    "(\"%s\", \"%s\", ...)",    "%d",        },
  529.   { 1, "tempnam",    vp,    "(\"%s\", \"%s\")",    "\"%s\"",        },
  530.   { 1, "tmpfile",    vp,    "()",    "$%lx",        },
  531.   { 1, "ungetc",    vp,    "(%d, $%lx)",    "%d",        },
  532.   { 1, "vfprintf",    vp,    "($%lx, \"%s\", $%lx)",    "%d",        },
  533.   { 1, "vprintf",    vp,    "(\"%s\", $%lx)",    "%d",        },
  534.   { 1, "vscanf",    vp,    "(\"%s\", $%lx)",    "%d",        },
  535.   { 1, "vsnprintf",    vp,    "(\"%s\", %d, \"%s\", $%lx)",    "%d",        },
  536.   { 1, "vsprintf",    vp,    "(\"%s\", $%lx)",    "%d",        },
  537.   { 1, "vsscanf",    vp,    "(\"%s\", \"%s\", $%lx)",    "%d",        },
  538.   { 1, "crypt",    vp,    "(\"%s\", \"%s\")",    "\"%s\"",        },
  539.   { 1, "des_cipher",    vp,    "(\"%s\", \"%s\", %d, %d)",    "%d",        },
  540.   { 1, "des_setkey",    vp,    "(\"%s\")",    "%d",        },
  541.   { 1, "encrypt",    vp,    "(\"%s\", %d)", "%d",        },
  542.   { 1, "setkey",    vp,    "(\"%s\")",    "%d",        },
  543.   { 1, "fnmatch",    vp,    "(\"%s\", \"%s\", %d)",    "%d",        },
  544.   { 1, "fts_children",vp,    "($%lx)",    "$%lx",        },
  545.   { 1, "fts_close",    vp,    "($%lx)",    "%d",        },
  546.   { 1, "fts_open",    vp,    "($%lx, %d, $%lx)",    "$%lx",        },
  547.   { 1, "fts_read",    vp,    "($%lx)",    "$%lx",        },
  548.   { 1, "fts_set",    vp,    "($%lx, $%lx, %d)",    "%d",        },
  549.   { 1, "cuserid",    vp,    "(\"%s\")",    "\"%s\"",        },
  550.   { 1, "getlogin",    vp,    "()",    "\"%s\"",        },
  551.   { 1, "glob",    vp,    "(\"%s\", %d, $%lx, $%lx)",    "%d",        },
  552.   { 1, "globfree",    vp,    "($%lx)",    "",        },
  553.   { 1, "__amiga_filehandle",vp,    "(%d)",    "$%lx",        },
  554.   { 1, "times",    vp,    "($%lx)",    "$%lx",        },
  555.   { 1, "mblen",    vp,    "(\"%s\", %d)",    "%d",        },
  556.   { 1, "mbstowcs",    vp,    "($%lx, \"%s\", %d)",    "%d",        },
  557.   { 1, "mbtowc",    vp,    "($%lx, \"%s\", %d)",    "%d",        },
  558.   { 1, "wcstombs",    vp,    "(\"%s\", $%lx, %d)",    "%d",        },
  559.   { 1, "wctomb",    vp,    "(\"%s\", $%lx)",    "%d",        },
  560.   { 1, "heapsort",    vp,    "($%lx, %d, %d, $%lx)",    "%d",        },
  561.   { 1, "radixsort",    vp,    "($%lx, %d, \"%s\", %d)",    "%d",        },
  562.   { 0, "__sflush",    vp,    "()",    "",        },
  563.   { 0, "__slbexpand",vp,    "()",    "",        },
  564.   { 0, "__sfp",    vp,    "()",    "",        },
  565.   { 0, "__sflags",    vp,    "()",    "",        },
  566.   { 0, "__sfvwrite",    vp,    "()",    "",        },
  567.   { 0, "__smakebuf",    vp,    "()",    "",        },
  568.   { 0, "__srefill",    vp,    "()",    "",        },
  569.   { 0, "__srget",    vp,    "()",    "",        },
  570.   { 0, "__sclose",    vp,    "()",    "",        },
  571.   { 0, "__sread",    vp,    "()",    "",        },
  572.   { 0, "__sseek",    vp,    "()",    "",        },
  573.   { 0, "__swrite",    vp,    "()",    "",        },
  574.   { 0, "__svfscanf",    vp,    "()",    "",        },
  575.   { 0, "__swbuf",    vp,    "()",    "",        },
  576.   { 0, "__swsetup",    vp,    "()",    "",        },
  577.   { 1, "fchdir",    vp,    "(%d)",    "%d",        },
  578.   { 1, "strtod",    vp,    "(\"%s\", $%lx)",    "%g",        },
  579.   { 1, "setgrent",    vp,    "()",    "",        },
  580.   { 1, "getgrent",    vp,    "()",    "",        },
  581.   { 1, "endgrent",    vp,    "()",    "",        },
  582.   { 1, "ix_resident",vp,    "(%d, $%lx, %d, $%lx)",    "",        },
  583.   { 1, "ix_geta4",    vp,    "()",    "",        },
  584.   { 1, "ix_check_cpu",vp,    "(%d)",    "",        },
  585.   { 1, "tracecntl",    vp,    "(%d, $%lx)",    "%d",        },
  586.   { 1, "sysconf",    vp,    "(%d)",    "%d",    },
  587.   { 1, "pathconf",    vp,    "(\"%s\", %d)", "%d",    },
  588.   { 1, "fpathconf",    vp,    "(%d, %d)",    "%d",    },
  589.   { 1, "getfsstat",    vp,    "($%lx, %d, %d)", "%d",    },
  590.   { 1, "fstatfs",    vp,    "(%d, $%lx)", "%d", },
  591.   { 1, "getmntinfo",    vp,    "($%lx, %d)",    "%d", },
  592.   { 1, "getgrnam",    vp,    "(\"%s\")",    "%d", },
  593.   { 1, "endpwent",    vp,    "()",    "", },
  594.   { 1, "sync",        vp,    "()",    "", },
  595.   { 1, "fork",        vp,    "()",    "%d", },
  596.   { 1, "mkfifo",    vp,    "(\"%s\", %o)",    "%d", },
  597.   { 1, "mknod",        vp,    "(\"%s\", %o)",    "%d", },
  598.   { 1, "setuid",    vp,    "(%d)",    "%d", },
  599.   { 1, "nice",        vp,    "(%d)",    "%d", },
  600.   { 1, "floor",        vp,    "(%g)",    "%g", },
  601.   { 1, "ceil",        vp,    "(%g)",    "%g", },
  602.   { 1, "setgid",    vp,    "(%d)",    "%d", },
  603. };
  604.  
  605. /* should help make things less mystic... */
  606. #define TP_SCALL(tp) (tp->tp_argv[0])
  607. /* this is only valid if !tp->tp_is_entry */
  608. #define TP_RESULT(tp) (tp->tp_argv[1])
  609. #define TP_ERROR(tp) (* tp->tp_errno)
  610. /* tp_argv[2] is the return address */
  611. #define TP_FIRSTARG(tp) (tp->tp_argv[3])
  612.  
  613. void
  614. print_call (FILE *output, struct trace_packet *tp)
  615. {
  616.   char line[82];
  617.   char *argfield;
  618.   int space, len;
  619.   struct call *c;
  620.  
  621.   space = sizeof (line) - 1;
  622.   len = sprintf (line, "$%lx: %c", tp->tp_message.mn_ReplyPort,
  623.                tp->tp_is_entry ? '>' : '<');
  624.   argfield = line + len;
  625.   space -= len;
  626.  
  627.   if (TP_SCALL (tp) > sizeof (call_table) / sizeof (struct call))
  628.     {
  629.       if (tp->tp_is_entry)
  630.         snprintf (argfield, space, "SYS_%d()\n", TP_SCALL (tp));
  631.       else
  632.         snprintf (argfield, space, "SYS_%d() = $%lx (%d)\n", 
  633.           TP_SCALL (tp), TP_RESULT (tp), TP_ERROR (tp));
  634.     }
  635.   else
  636.     {
  637.       c = call_table + TP_SCALL (tp);
  638.  
  639.       if ((!print_all && !c->interesting) || 
  640.       (skip_sigsetmask && TP_SCALL (tp) == SYS_sigsetmask))
  641.     return;
  642.  
  643.       c->func (argfield, space, c, tp);
  644.     }
  645.  
  646.   fputs (line, output);
  647. }
  648.  
  649. void
  650. vp (char *buf, int len, struct call *c, struct trace_packet *tp)
  651. {
  652.   int nl = snprintf (buf, len, "%s", c->name);
  653.  
  654.   len -= nl;
  655.   buf += nl;
  656.   if (tp->tp_is_entry || !c->rfmt[0])
  657.     vsnprintf (buf, len-1, c->fmt, (_VA_LIST_) & TP_FIRSTARG (tp));
  658.   else
  659.     {
  660.       nl = vsnprintf (buf, len-1, c->fmt, (_VA_LIST_) & TP_FIRSTARG (tp));
  661.       len -= nl;
  662.       buf += nl;
  663.       nl = snprintf (buf, len-1, "=");
  664.       len -= nl;
  665.       buf += nl;
  666.       nl = vsnprintf (buf, len-1, c->rfmt, (_VA_LIST_) & TP_RESULT (tp));
  667.       len -= nl;
  668.       buf += nl;
  669.       nl = snprintf (buf, len-1, " (%d)", TP_ERROR (tp));
  670.     }
  671.  
  672.   strcat (buf, "\n");
  673. }
  674.  
  675. const char *
  676. get_fcntl_cmd (int cmd)
  677. {
  678.   switch (cmd)
  679.     {
  680.     case F_DUPFD:
  681.     return "F_DUPFD";
  682.  
  683.     case F_GETFD:
  684.     return "F_GETFD";
  685.  
  686.     case F_SETFD:
  687.     return "F_SETFD";
  688.  
  689.     case F_GETFL:
  690.     return "F_GETFL";
  691.  
  692.     case F_SETFL:
  693.     return "F_SETFL";
  694.     
  695.     case F_GETOWN:
  696.     return "F_GETOWN";
  697.  
  698.     case F_SETOWN:
  699.     return "F_SETOWN";
  700.  
  701.     case F_GETLK:
  702.     return "F_GETLK";
  703.  
  704.     case F_SETLK:
  705.     return "F_SETLK";
  706.  
  707.     case F_SETLKW:
  708.     return "F_SETLKW";
  709.  
  710.     default:
  711.     return "F_unknown";
  712.     }
  713. }
  714.  
  715. char *
  716. get_open_mode (int mode)
  717. {
  718.   static char buf[1000];
  719.   
  720.   switch (mode & O_ACCMODE)
  721.     {
  722.     case O_RDONLY: 
  723.       strcpy (buf, "O_RDONLY");
  724.       break;
  725.       
  726.     case O_WRONLY:
  727.       strcpy (buf, "O_WRONLY");
  728.       break;
  729.       
  730.     case O_RDWR:
  731.       strcpy (buf, "O_RDWR");
  732.       break;
  733.       
  734.     default:
  735.       strcpy (buf, "O_illegal");
  736.       break;
  737.     }
  738.  
  739. #define ADD(flag) \
  740.   if (mode & flag) strcat (buf, "|" #flag);
  741.  
  742.   ADD (O_NONBLOCK);  
  743.   ADD (O_APPEND);
  744.   ADD (O_SHLOCK);
  745.   ADD (O_EXLOCK);
  746.   ADD (O_ASYNC);
  747.   ADD (O_FSYNC);
  748.   ADD (O_CREAT);
  749.   ADD (O_TRUNC);
  750.   ADD (O_EXCL);
  751. #undef ADD
  752.   
  753.   return buf;
  754. }
  755.  
  756. char *
  757. get_ioctl_cmd (int cmd)
  758. {
  759.   static char buf[255];
  760.  
  761.   /* only deal with those commands that are really implemented somehow in
  762.      ixemul.library. The others are dummies anyway, so they don't matter */
  763.  
  764.   switch (cmd)
  765.     {
  766.     case FIONREAD:
  767.       return "FIONREAD";
  768.  
  769.     case FIONBIO:
  770.       return "FIONBIO";
  771.  
  772.     case FIOASYNC:
  773.       /* not yet implemented, but important to know if some program tries
  774.          to use it ! */
  775.       return "FIOASYNC";
  776.  
  777.     case TIOCGETA:
  778.       return "TIOCGETA";
  779.  
  780.     case TIOCSETA:
  781.       return "TIOCSETA";
  782.  
  783.     case TIOCSETAW:
  784.       return "TIOCSETAW";
  785.  
  786.     case TIOCSETAF:
  787.       return "TIOCSETAF";
  788.  
  789.     case TIOCGETP:
  790.       return "TIOCGETP";
  791.  
  792.     case TIOCSETN:
  793.       return "TIOCSETN";
  794.  
  795.     case TIOCSETP:
  796.       return "TIOCSETP";
  797.  
  798.     case TIOCGWINSZ:
  799.       return "TIOCGWINSZ";
  800.  
  801.     case TIOCOUTQ:
  802.       return "TIOCOUTQ";
  803.  
  804.     case TIOCSWINSZ:
  805.       return "TIOCSWINSZ";
  806.       
  807.     default:
  808.       sprintf (buf, "$%lx", cmd);
  809.       return buf;
  810.     }
  811. }
  812.  
  813.  
  814. void
  815. vp_fcntl (char *buf, int len, struct call *c, struct trace_packet *tp)
  816. {
  817.   long *argv = & TP_FIRSTARG (tp);
  818.   
  819.   if (tp->tp_is_entry)
  820.     if (argv[1] == F_GETFL || argv[1] == F_SETFL)
  821.       snprintf (buf, len-1, "fcntl(%d, %s, %s)",
  822.             argv[0], get_fcntl_cmd (argv[1]), get_open_mode (argv[2]));
  823.     else
  824.       snprintf (buf, len-1, "fcntl(%d, %s, %d)",
  825.             argv[0], get_fcntl_cmd (argv[1]), argv[2]);
  826.   else
  827.     if (argv[1] == F_GETFL || argv[1] == F_SETFL)
  828.       snprintf (buf, len-1, "fcntl(%d, %s, %s) = %d (%d)",
  829.             argv[0], get_fcntl_cmd (argv[1]), 
  830.         get_open_mode (argv[2]), TP_RESULT (tp), TP_ERROR (tp));
  831.     else
  832.       snprintf (buf, len-1, "fcntl(%d, %s, %d) = %d (%d)",
  833.             argv[0], get_fcntl_cmd (argv[1]), argv[2], 
  834.         TP_RESULT (tp), TP_ERROR (tp));
  835.  
  836.   strcat (buf, "\n");
  837. }
  838.  
  839.  
  840. void
  841. vp_ioctl (char *buf, int len, struct call *c, struct trace_packet *tp)
  842. {
  843.   long *argv = & TP_FIRSTARG (tp);
  844.   
  845.   if (tp->tp_is_entry)
  846.     snprintf (buf, len-1, "ioctl(%d, %s, $%lx)",
  847.           argv[0], get_ioctl_cmd (argv[1]), argv[2]);
  848.   else
  849.     snprintf (buf, len-1, "ioctl(%d, %s, $%lx) = %d (%d)",
  850.           argv[0], get_ioctl_cmd (argv[1]), argv[2],
  851.           TP_RESULT (tp), TP_ERROR (tp));
  852.  
  853.   strcat (buf, "\n");
  854. }
  855.  
  856.  
  857. void
  858. vp_open (char *buf, int len, struct call *c, struct trace_packet *tp)
  859. {
  860.   long *argv = & TP_FIRSTARG (tp);
  861.  
  862.   if (tp->tp_is_entry)
  863.     snprintf (buf, len-1, "open(\"%s\", %s)", argv[0], get_open_mode (argv[1]));
  864.   else
  865.     snprintf (buf, len-1, "open(\"%s\", %s) = %d (%d)", argv[0], 
  866.           get_open_mode (argv[1]), TP_RESULT (tp), TP_ERROR (tp));
  867.  
  868.   strcat (buf, "\n");
  869. }
  870.  
  871. void
  872. vp_pipe (char *buf, int len, struct call *c, struct trace_packet *tp)
  873. {
  874.   long *argv = & TP_FIRSTARG (tp);
  875.  
  876.   if (tp->tp_is_entry)
  877.     snprintf (buf, len-1, "pipe($%lx)", argv[0]);
  878.   else
  879.     {
  880.       int *pv = (int *) argv[0];
  881.     
  882.       snprintf (buf, len-1, "pipe([%d, %d]) = %d (%d)", 
  883.         pv[0], pv[1], TP_RESULT (tp), TP_ERROR (tp));
  884.     }
  885.  
  886.   strcat (buf, "\n");
  887. }
  888.